package cn.lasse.design;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 在这个类中主要实现的核心功能就是记录配置文件信息，也就是备忘录的效果，
 * 之后提供可以回滚和获取的方法，拿到备忘录的具体内容。
 */
public class Admin {
    private int cursorIdx = -1;
    private List<ConfigMemento> mementoList = new ArrayList<>();
    private Map<String, ConfigMemento> mementoMap = new ConcurrentHashMap<>();

    /**
     * 存放
     */
    public void append(ConfigMemento memento) {
        cursorIdx++;
        mementoList.add(memento);
        mementoMap.put(memento.getConfigFile().getVersionNo(), memento);
    }

    /**
     * 回滚
     */
    public ConfigMemento undo() {
        if (--cursorIdx <= 0) {
            return mementoList.get(0);
        }
        return mementoList.get(cursorIdx);
    }

    /**
     * 返回
     */
    public ConfigMemento redo() {
        if (++cursorIdx > mementoList.size()) {
            return mementoList.get(mementoList.size() - 1);
        }
        return mementoList.get(cursorIdx);
    }

    /**
     * 定向获取
     */
    public ConfigMemento get(String versionNo){
        return mementoMap.get(versionNo);
    }
}
